package com.sh.d1.gameserver.cmdhandler;

import com.google.protobuf.Message;
import com.sh.d1.gameserver.InternalServerMsg;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;

/**
 * 自定义的命令处理器上下文
 */
public class MyCmdHandlerContext {
    /**
     * 真实对象
     */
    private final ChannelHandlerContext _realCtx;

    /**
     * 网关服务器 Id
     */
    private final int _gatewayServerId;

    /**
     * 远程服务器会话 Id
     */
    private final int _remoteSessionId;

    /**
     * 来自用户 Id
     */
    private  int _fromUserId;


    /**
     * 类参数构造器
     *
     * @param realCtx         真实对象
     * @param gatewayServerId 网关服务器 Id
     * @param remoteSessionId 远程服务器会话 Id
     * @param fromUserId      来自用户 Id
     */
    public MyCmdHandlerContext(ChannelHandlerContext realCtx, int gatewayServerId, int remoteSessionId, int fromUserId) {
        _realCtx = realCtx;
        _gatewayServerId = gatewayServerId;
        _remoteSessionId = remoteSessionId;
        _fromUserId = fromUserId;
    }

    /**
     * 获取网关服务器id
     * @return
     */
    public int getGatewayServerId() {
        return _gatewayServerId;
    }

    /**
     * 获取用户id
     * @return
     */
    public  int  getFromUserId() {
        return _fromUserId;
    }

    /**
     * 设置用户id
     * @param val
     */
    public void setFromUserId(int val) {
        _fromUserId=val;
    }

    /**
     * 消息对象
     *
     * @param msgObj 消息对象
     * @return 信道预期
     */
    public ChannelFuture writeAndFlush(Object msgObj) {
        if (null != msgObj) {
            return _realCtx.writeAndFlush(wrapMsg(msgObj));
        } else {
            return null;
        }
    }

    /**
     * 包装消息
     *
     * @param msgObj 消息对象
     * @return 原始消息对象 或 服务器内部消息
     */
    private Object wrapMsg(Object msgObj) {
        if (!(msgObj instanceof Message)) {
            return msgObj;
        }

        return new InternalServerMsg()
            .setGatewayServerId(_gatewayServerId)
            .setRemoteSessionId(_remoteSessionId)
            .setFromUserId(_fromUserId)
            .setMsgObj((Message) msgObj);
    }
}
